{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Wide & Deep Recommender Demo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Wide and Deep Learning Model, proposed by Google in 2016, is a DNN-Linear mixed model. Wide and deep learning has been used for Google App Store for their app recommendation.\n",
    "\n",
    "In this tutorial, we use Recommender API of Analytics Zoo to build a wide linear model and a deep neural network, which is called Wide&Deep model, and use optimizer of BigDL to train the neural network. Wide&Deep model combines the strength of memorization and generalization. It's useful for generic large-scale regression and classification problems with sparse input features (e.g., categorical features with a large number of possible feature values)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Intialization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "import necessary libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "from zoo.models.recommendation import *\n",
    "from zoo.models.recommendation.utils import *\n",
    "from zoo.common.nncontext import init_nncontext\n",
    "import os\n",
    "import sys\n",
    "import datetime as dt\n",
    "\n",
    "import matplotlib\n",
    "matplotlib.use('agg')\n",
    "import matplotlib.pyplot as plt\n",
    "%pylab inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Initilaize NN context, it will get a SparkContext with optimized configuration for BigDL performance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "sc = init_nncontext(\"WideAndDeep Example\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data Preparation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Download and read movielens 1M rating data, understand the dimension."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000209, 3)\n",
      "(1, 6040, 1, 3952, array([1, 2, 3, 4, 5]))\n"
     ]
    }
   ],
   "source": [
    "from bigdl.dataset import movielens\n",
    "movielens_data = movielens.get_id_ratings(\"/tmp/movielens/\")\n",
    "min_user_id = np.min(movielens_data[:,0])\n",
    "max_user_id = np.max(movielens_data[:,0])\n",
    "min_movie_id = np.min(movielens_data[:,1])\n",
    "max_movie_id = np.max(movielens_data[:,1])\n",
    "rating_labels= np.unique(movielens_data[:,2])\n",
    "\n",
    "print(movielens_data.shape)\n",
    "print(min_user_id, max_user_id, min_movie_id, max_movie_id, rating_labels)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Transform ratings into dataframe, read user and item data into dataframes. Transform labels to zero-based since the original labels start from 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "sqlContext = SQLContext(sc)\n",
    "from pyspark.sql.types import *\n",
    "from pyspark.sql import Row\n",
    "\n",
    "Rating = Row(\"userId\", \"itemId\", \"label\")\n",
    "User = Row(\"userId\", \"gender\", \"age\" ,\"occupation\")\n",
    "Item = Row(\"itemId\", \"title\" ,\"genres\")\n",
    "\n",
    "ratings = sc.parallelize(movielens_data)\\\n",
    "    .map(lambda l: (int(l[0]), int(l[1]), int(l[2])-1))\\\n",
    "    .map(lambda r: Rating(*r))\n",
    "ratingDF = sqlContext.createDataFrame(ratings)\n",
    "\n",
    "users= sc.textFile(\"/tmp/movielens/ml-1m/users.dat\")\\\n",
    "    .map(lambda l: l.split(\"::\")[0:4])\\\n",
    "    .map(lambda l: (int(l[0]), l[1], int(l[2]), int(l[3])))\\\n",
    "    .map(lambda r: User(*r))\n",
    "userDF = sqlContext.createDataFrame(users)\n",
    "\n",
    "items = sc.textFile(\"/tmp/movielens/ml-1m/movies.dat\")\\\n",
    "    .map(lambda l: l.split(\"::\")[0:3])\\\n",
    "    .map(lambda l: (int(l[0]), l[1], l[2].split('|')[0]))\\\n",
    "    .map(lambda r: Item(*r))\n",
    "itemDF = sqlContext.createDataFrame(items)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Join data together, and transform data. For example, gender is going be used as categorical feature, occupation and gender will be used as crossed features."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------+------+-----+------+---+----------+--------------+------+----------+\n",
      "|itemId|userId|label|gender|age|occupation|         title|genres|age-gender|\n",
      "+------+------+-----+------+---+----------+--------------+------+----------+\n",
      "|    26|  3391|    3|     2| 18|         4|Othello (1995)|     5|        24|\n",
      "|    26|  1447|    4|     2| 18|         4|Othello (1995)|     5|        24|\n",
      "|    26|  5107|    3|     1| 45|         0|Othello (1995)|     5|         5|\n",
      "|    26|  2878|    3|     1| 50|        20|Othello (1995)|     5|        47|\n",
      "|    26|  1527|    1|     2| 18|        10|Othello (1995)|     5|        24|\n",
      "+------+------+-----+------+---+----------+--------------+------+----------+\n",
      "only showing top 5 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from pyspark.sql.functions import col, udf\n",
    "\n",
    "gender_udf = udf(lambda gender: categorical_from_vocab_list(gender, [\"F\", \"M\"], start=1))\n",
    "bucket_cross_udf = udf(lambda feature1, feature2: hash_bucket(str(feature1) + \"_\" + str(feature2), bucket_size=100))\n",
    "genres_list = [\"Crime\", \"Romance\", \"Thriller\", \"Adventure\", \"Drama\", \"Children's\",\n",
    "      \"War\", \"Documentary\", \"Fantasy\", \"Mystery\", \"Musical\", \"Animation\", \"Film-Noir\", \"Horror\",\n",
    "      \"Western\", \"Comedy\", \"Action\", \"Sci-Fi\"]\n",
    "genres_udf = udf(lambda genres: categorical_from_vocab_list(genres, genres_list, start=1))\n",
    "     \n",
    "allDF = ratingDF.join(userDF, [\"userId\"]).join(itemDF, [\"itemId\"]) \\\n",
    "        .withColumn(\"gender\", gender_udf(col(\"gender\")).cast(\"int\")) \\\n",
    "        .withColumn(\"age-gender\", bucket_cross_udf(col(\"age\"), col(\"gender\")).cast(\"int\")) \\\n",
    "        .withColumn(\"genres\", genres_udf(col(\"genres\")).cast(\"int\"))\n",
    "allDF.show(5)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Speficy data feature information shared by the WideAndDeep model and its feature generation. Here, we use occupation gender for wide base part, age and gender crossed as wide cross part, genres and gender as indicators, userid and itemid for embedding.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "bucket_size = 100\n",
    "column_info = ColumnFeatureInfo(\n",
    "            wide_base_cols=[\"occupation\", \"gender\"],\n",
    "            wide_base_dims=[21, 3],\n",
    "            wide_cross_cols=[\"age-gender\"],\n",
    "            wide_cross_dims=[bucket_size],\n",
    "            indicator_cols=[\"genres\", \"gender\"],\n",
    "            indicator_dims=[19, 3],\n",
    "            embed_cols=[\"userId\", \"itemId\"],\n",
    "            embed_in_dims=[max_user_id, max_movie_id],\n",
    "            embed_out_dims=[64, 64],\n",
    "            continuous_cols=[\"age\"])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Transform data to  RDD of Sample. We use optimizer of BigDL directly to train the model, it requires data to be provided in format of RDD(Sample). A Sample is a BigDL data structure which can be constructed using 2 numpy arrays, feature and label respectively. The API interface is Sample.from_ndarray(feature, label).  Wide&Deep model need two input tensors, one is SparseTensor for the Wide model, another is a DenseTensor for the Deep model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "rdds = allDF.rdd.map(lambda row: to_user_item_feature(row, column_info))\n",
    "trainPairFeatureRdds, valPairFeatureRdds = rdds.randomSplit([0.8, 0.2], seed= 1)\n",
    "valPairFeatureRdds.persist()\n",
    "train_data= trainPairFeatureRdds.map(lambda pair_feature: pair_feature.sample)\n",
    "test_data= valPairFeatureRdds.map(lambda pair_feature: pair_feature.sample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Create the Wide&Deep model."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In Analytics Zoo, it is simple to build Wide&Deep model by calling WideAndDeep API. You need specify model type, and class number, as well as column information of features according to your data. You can also change other default parameters in the network, like hidden layers. The model could be fed into an Optimizer of BigDL or NNClassifier of analytics-zoo. Please refer to the document for more details. In this example, we demostrate how to use optimizer of BigDL."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "creating: createZooKerasInput\n",
      "creating: createZooKerasInput\n",
      "creating: createZooKerasInput\n",
      "creating: createZooKerasInput\n",
      "creating: createZooKerasSparseDense\n",
      "creating: createZooKerasFlatten\n",
      "creating: createZooKerasSelect\n",
      "creating: createZooKerasEmbedding\n",
      "creating: createZooKerasFlatten\n",
      "creating: createZooKerasFlatten\n",
      "creating: createZooKerasSelect\n",
      "creating: createZooKerasEmbedding\n",
      "creating: createZooKerasFlatten\n",
      "creating: createZooKerasMerge\n",
      "creating: createZooKerasDense\n",
      "creating: createZooKerasDense\n",
      "creating: createZooKerasDense\n",
      "creating: createZooKerasDense\n",
      "creating: createZooKerasMerge\n",
      "creating: createZooKerasActivation\n",
      "creating: createZooKerasModel\n",
      "creating: createZooWideAndDeep\n"
     ]
    }
   ],
   "source": [
    "wide_n_deep = WideAndDeep(5, column_info, \"wide_n_deep\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create optimizer and train the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "creating: createAdam\n",
      "creating: createZooKerasSparseCategoricalCrossEntropy\n",
      "creating: createZooKerasSparseCategoricalAccuracy\n"
     ]
    }
   ],
   "source": [
    "wide_n_deep.compile(optimizer = \"adam\",\n",
    "                    loss= \"sparse_categorical_crossentropy\",\n",
    "                    metrics=['accuracy'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "tmp_log_dir = create_tmp_path()\n",
    "wide_n_deep.set_tensorboard(tmp_log_dir, \"training_wideanddeep\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Train the network. Wait some time till it finished.. Voila! You've got a trained model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimization Done.\n",
      "CPU times: user 54.3 ms, sys: 19.7 ms, total: 74 ms\n",
      "Wall time: 2min 30s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "# Boot training process\n",
    "wide_n_deep.fit(train_data,\n",
    "                batch_size = 8000,\n",
    "                nb_epoch = 10,\n",
    "                validation_data = test_data)\n",
    "print(\"Optimization Done.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prediction and recommendation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Zoo models make inferences based on the given data using model.predict(val_rdd) API. A result of RDD is returned. predict_class returns the predicted label."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[4, 2, 4, 5, 2]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results = wide_n_deep.predict(test_data)\n",
    "results.take(5)\n",
    "\n",
    "results_class = wide_n_deep.predict_class(test_data)\n",
    "results_class.take(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the Analytics Zoo, Recommender has provied 3 unique APIs to predict user-item pairs and make recommendations for users or items given candidates.\n",
    "Predict for user item pairs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "UserItemPrediction [user_id: 5305, item_id: 26, prediction: 4, probability: 0.447520256042]\n",
      "UserItemPrediction [user_id: 1150, item_id: 26, prediction: 2, probability: 0.42147180438]\n",
      "UserItemPrediction [user_id: 4294, item_id: 26, prediction: 4, probability: 0.338612318039]\n",
      "UserItemPrediction [user_id: 5948, item_id: 26, prediction: 5, probability: 0.385789096355]\n",
      "UserItemPrediction [user_id: 3825, item_id: 26, prediction: 2, probability: 0.292931675911]\n"
     ]
    }
   ],
   "source": [
    "userItemPairPrediction = wide_n_deep.predict_user_item_pair(valPairFeatureRdds)\n",
    "for result in userItemPairPrediction.take(5): print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Recommend 3 items for each user given candidates in the feature RDDs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "UserItemPrediction [user_id: 4904, item_id: 1221, prediction: 5, probability: 0.901316523552]\n",
      "UserItemPrediction [user_id: 4904, item_id: 593, prediction: 5, probability: 0.890776693821]\n",
      "UserItemPrediction [user_id: 4904, item_id: 913, prediction: 5, probability: 0.888917982578]\n",
      "UserItemPrediction [user_id: 1084, item_id: 50, prediction: 5, probability: 0.632001161575]\n",
      "UserItemPrediction [user_id: 1084, item_id: 912, prediction: 5, probability: 0.584099054337]\n"
     ]
    }
   ],
   "source": [
    "userRecs = wide_n_deep.recommend_for_user(valPairFeatureRdds, 3)\n",
    "for result in userRecs.take(5): print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Recommend 3 users for each item given candidates in the feature RDDs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "UserItemPrediction [user_id: 1835, item_id: 1084, prediction: 5, probability: 0.745298802853]\n",
      "UserItemPrediction [user_id: 3864, item_id: 1084, prediction: 5, probability: 0.744241654873]\n",
      "UserItemPrediction [user_id: 5582, item_id: 1084, prediction: 5, probability: 0.739497065544]\n",
      "UserItemPrediction [user_id: 4511, item_id: 3764, prediction: 4, probability: 0.44239372015]\n",
      "UserItemPrediction [user_id: 116, item_id: 3764, prediction: 4, probability: 0.365347951651]\n"
     ]
    }
   ],
   "source": [
    "itemRecs = wide_n_deep.recommend_for_item(valPairFeatureRdds, 3)\n",
    "for result in itemRecs.take(5): print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Draw the convergence curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,1,'loss')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nRIz/A5EtacEI/VRDAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#retrieve train and validation summary object and read the loss data into ndarray's. \n",
    "train_loss = np.array(wide_n_deep.get_train_summary(\"Loss\"))\n",
    "val_loss = np.array(wide_n_deep.get_validation_summary(\"Loss\"))\n",
    "#plot the train and validation curves\n",
    "# each event data is a tuple in form of (iteration_count, value, timestamp)\n",
    "plt.figure(figsize = (12,6))\n",
    "plt.plot(train_loss[:,0],train_loss[:,1],label='train loss')\n",
    "plt.plot(val_loss[:,0],val_loss[:,1],label='val loss',color='green')\n",
    "plt.scatter(val_loss[:,0],val_loss[:,1],color='green')\n",
    "plt.legend();\n",
    "plt.xlim(0,train_loss.shape[0]+10)\n",
    "plt.grid(True)\n",
    "plt.title(\"loss\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "plot accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 1010)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nsWl9zYsvnKs/u/WS0+7z5S9/WS+99JKee+45/fCHP9Tf/u3f6vnnn1cikdA111yjN7/5zZKkLVu2\naPv27Vq2bJluvvlm/ehHP9Idd9wxrfUCAAAgHAzbOAexWEx33nmnIpGI5s+fr7e85S3aunWrJOna\na6/VypUrFYlEdOeddyoWi4VcLQAAQOlwdw0MJ7W3a1BP7+nRs0eScvdpe/2C63k+Uw9x2CbPmMEM\nGgAAAOcnlXb1DI6oq39Eif5hJfqHx5939Y+oa2BYnf0j6gq2DY2mJxz/X25PqbZyemJvTq9iZjdL\n+p+SIpL+3t2/fIr93ivpB5Kucfdtwbo3Svo7SXMlpYNtBTeZcV1dnfr6+iRJGzZs0N/93d/pIx/5\niLq7u/XrX/9aX/3qV/Xqq69qy5Yt2rVrl5YtW6bvf//7uvvuu0OuHAAAIP8MjabU2TesroEToTcx\nKRAn+jKP3QMjSk/ReRwpMzXVVKiptlLNtRVa2VyjppoKNddVZh5rK7XntRdVFZ2+wRZnDM9mFpH0\nDUk3SdovaauZPeru2yftVyfpk5KeyloXlfSgpLvc/Xkza5I0Om3Vz6KmpiatW7dOl156qW655Ra9\n8Y1v1OWXXy4z03333acFCxbo1Vdf1TXXXKN77rln/ILB97znPZKkz372s3rooYc0ODioxYsX6+Mf\n/7i+8IUvhPtDAQBQQNJp19Hjo+rqHwtcI+oeyASusYDVPTCivt7j+t6+baqpjKq2MqrqiqhqKyOq\nqYyqpiKaeZywHBnftzJaxrfG5yiddvUeHx0PwZnwm/msToTiYFv/sAZGUlO+Tm1lVE21FWqqqdCy\npmpdtWyemmszQTizvlItdZnH+jnlKis7/efV9npE0cgshmdJ10qKu/tOSTKzhyXdLmn7pP3+QtJX\nJH0ma93bJb3g7s9Lkrt3nXfFIXrooYcmLH/1q189aZ+5c+fqJz/5yUnr77vvPt13330zVhsAAIXG\n3XXseFKJIPhmh+KJAfn0vY+SNK+6XI01FWqsqdBQUtqdGFT/cFIDI0kNDqc0kkpPfeAkkTJTdUUk\nCN2Zx5qsAF4dhOzs0J0J4RPDeG1lVNWVUVWXR84Y7vLZcDIVfB4nhksksj6f7OXugRElp/iAykxq\nrMn0DDfVVujKpQ1qqskE4ZYgEGcH4zkVkRB+0tzlEp4XSdqXtbxf0nXZO5jZVZKWuPtPzSw7PL9B\n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\nQmCC\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (12,6))\n",
    "top1 = np.array(wide_n_deep.get_validation_summary(\"Top1Accuracy\"))\n",
    "plt.plot(top1[:,0],top1[:,1],label='top1')\n",
    "plt.title(\"top1 accuracy\")\n",
    "plt.grid(True)\n",
    "plt.legend();\n",
    "plt.xlim(0,train_loss.shape[0]+10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PythonRDD[82] at RDD at PythonRDD.scala:48"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valPairFeatureRdds.unpersist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "sc.stop()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
